from import_export import resources
from import_export.fields import Field


class CustomerModelResource(resources.ModelResource):
    # 自动导入表头，这将使得在处理导入文件时能够根据表头自动匹配模型字段

    auto_import_headers = True

    def get_export_headers(self, selected_fields=None):
        """
        重写此方法以自定义导出的列头。

        Args:
            selected_fields (list, optional): 指定需要导出的字段。

        Returns:
            list: 返回自定义的导出列头列表。
        """
        # 创建字段名称到其详细名称（verbose_name）的映射
        vnames = {i.name: i.verbose_name for i in self.Meta.model._meta.fields}
        # 将每个字段名转换为其详细名称，如果没有详细名称则使用原字段名
        return [
            vnames.get(i.split("__")[0], i)
            for i in super().get_export_headers(selected_fields)
        ]

    def set_import_headers(self, headers):
        """
        设置导入数据时使用的表头，确保即使CSV表头是友好名称也能正确映射到数据库字段。

        Args:
            headers (list): 导入文件中的原始表头列表。

        Returns:
            list: 映射后的数据库字段名列表。
        """
        # 创建字段详细名称到字段名称的映射
        vnames = {i.verbose_name: i.name for i in self.Meta.model._meta.fields}
        # 将每个表头转换为对应的模型字段名
        return [vnames.get(i, i) for i in headers]

    def get_or_init_instance(self, instance_loader, row):
        # 创建或获取实例，并标记是否为新建实例
        create_new = self._meta.force_init_instance
        if not create_new:
            instance = self.get_instance(instance_loader, row)
            create_new = instance is None

        if create_new:
            # 初始化新实例
            instance = self.init_instance(row)
        else:
            # 更新已有实例的修改者信息（如果存在creator）
            if instance.creator:
                setattr(instance, "modifier", str(self.user.id))

        # 设置创建者和部门ID，仅当实例为新建时设置创建者
        if create_new or not instance.creator:
            setattr(instance, "creator_id", str(self.user.id))
        setattr(instance, "dept_belong_id", str(self.user.dept_belong_id))

        return instance, create_new
